summaryrefslogtreecommitdiff
path: root/src/parser.y
blob: 7242df0b2eacee4bd817e91691c0a7aa631199ca (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
%{
#include <stdint.h>
#include <stdio.h>
#include <bu/string.h>

int yylex();
void yyerror( const char *error ) { printf("%s\n", error ); }
%}

%union {
	int64_t iValue;
	double dValue;
	Bu::String *sValue;
	bool bValue;
}

%token tokGame
%token tokFunction
%token tokSituation
%token tokWhile
%token tokFor
%token tokEach
%token tokIn
%token tokIf
%token tokThen
%token tokElse
%token tokNot
%token tokCommand
%token <sValue> tokSituationName
%token <sValue> tokIdent
%token tokGoto
%token <sValue> tokString
%token <iValue> tokInt
%token <dValue> tokFloat
%token <bValue> tokBool
%token tokNull

%destructor { delete $$; printf("string deleted.\n"); } tokString tokSituationName

%token eos 0 "end of stream"

%left '(' ')' '[' ']'
%left '*' '/'
%left '-' '+'

%%
input: gameDecl bodyDecl
	 ;

gameDecl: tokGame '{' gameExprList '}'
		;

gameExprList:
			| gameExprList cmpltGameExpr
			;

cmpltGameExpr: gameExpr ';'
			 | commandDecl
			 ;

gameExpr: tokIdent '=' expr
		;

bodyDecl:
		| bodyDecl situation
		| bodyDecl function
		;

situation: tokSituation tokSituationName { printf("Read situtaion: %s\n", (*$2).getStr() ); } '{' cmpltExprList '}'
		 ;

function: tokFunction tokIdent '(' ')' '{' '}'
		;

cmpltExprList:
			 | cmpltExprList cmpltExpr
			 ;

cmpltExpr: expr ';'
		 | tokGoto '(' expr ')' ';'
		 ;

expr: tokInt
	| tokFloat
	| tokString
	| tokBool
	| tokNull
	| tokSituationName
	| expr '+' expr
	| expr '-' expr
	| expr '/' expr
	| expr '*' expr
	| '(' expr ')'
	| expr '[' expr ']'
	| '[' ']'
	| '[' listValues ']'
	| '{' '}'
	| '{' dictValues '}'
	;

listValues: expr
		  | listValues ',' expr
		  ;

dictValues: expr ':' expr
		  | dictValues ',' expr ':' expr
		  ;

commandDecl: tokCommand ':' tokString commandParamList '{' '}'
		   ;

commandParamList:
				| commandParamList tokString
				| commandParamList tokIdent
				;
%%

int main()
{
	yyparse();
	return 0;
}